package com.maysev.myjob_backend.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.maysev.myjob_backend.common.R;
import com.maysev.myjob_backend.dto.ResetPassStuDto;
import com.maysev.myjob_backend.entity.Student;
import com.maysev.myjob_backend.service.StudentService;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.origin.Origin;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * @author 五七
 * @create 2023-03-16 16:19
 * @description:
 */
@RestController
@Slf4j
@CrossOrigin("http://localhost:8082")
@RequestMapping("/student")
public class StudentController {
    @Autowired
    private StudentService studentService;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 学生登录
     * @param student
     * @return 登录成功，返回学生对象；登录失败，返回错误信息
     */
    @PostMapping ("/login")
    public R<Student> Login(@RequestBody Student student){
//        - 登录失败
//                - 用户名不存在
//                - 查询数据库信息,匹配用户名,若为查询结果为空,则返回`用户名不存在`
//        - 密码错误
//                - 查询数据库信息,查询到相应用户名.但密码不匹配.则返回`密码错误`
//        - 登录成功
//                - 查询数据库信息.查询到相应用户,且密码匹配.返回`登录成功`1
        //1 将页面提交的密码进行MD5加密处理
        String password = student.getPassword();
        password = DigestUtils.md5DigestAsHex(password.getBytes());
        //2 根据页面提交的用户名username查询数据库
        LambdaQueryWrapper<Student> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Student::getUsername,student.getUsername());
        Student stu = studentService.getOne(queryWrapper);

        //3 没有查询到结果,用户名不存在
        if (stu == null){

            //查询数据库信息,匹配用户名,若为查询结果为空,则返回`用户名不存在`
            return R.error("用户名不存在");

        }
        // 4 密码错误
        if (!stu.getPassword().equals(password)){
        // 查询数据库信息,查询到相应用户名.但密码不匹配.则返回`密码错误`
            return R.error("密码错误!");
        }
        // 5 查看账号状态
        if (stu.getStatus().equals("0")){
            return R.error("账号已被禁用");
        }

        // 6 登录成功,将生成的令牌和登录信息存储到redis,并返回前台,用作登录登录检验
        String token = UUID.randomUUID().toString();

        redisTemplate.opsForValue().set("token",token,60, TimeUnit.MINUTES);



        return R.success(stu).add("token",token);
    }


    /**
     * 学生注册
     * @param student
     * @return
     */
    @PostMapping("/regist")
    public R<String> regist(@RequestBody Student student){
        //查询数据库是否存在该用户名
        log.info(student.toString());
        LambdaQueryWrapper<Student> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Student::getUsername,student.getUsername());

        List<Student> list = studentService.list(queryWrapper);

        if(!list.isEmpty()){
            //存在,返回用户名已存在信息
            return R.error("该用户已存在");
        }
        //不存在,则将数据保存到数据库返回注册成功信息
        //将密码加密后保存至数据库
        String password = student.getPassword();
        password = DigestUtils.md5DigestAsHex(password.getBytes());
        student.setPassword(password);

        //将账号的状态置为1
        student.setStatus("1");
        //将账号的角色置为1,表示学生
        student.setRole("1");

        studentService.save(student);

        return R.success("注册成功");

    }

    /**
     * 根据用户id查询用户信息
     * @param id
     * @return
     */
    @GetMapping({"/{id}"})
    public R<Student> getStudentById(@PathVariable Long id){
        log.info("本次查询的学生id为:{}",id.toString());
        Student student = studentService.getById(id);
        return R.success(student);
    }

    /**
     * 修改用户信息
     * @param student
     * @return
     */
    @PutMapping
    public R<String> updateStuInfo(@RequestBody Student student){
        log.info("获取的学生对象====>>>>{}",student.toString());

        studentService.updateById(student);
        return R.success("修改成功!");
    }

    @PutMapping("/resetPass")
    public R<String> resetpass(@RequestBody ResetPassStuDto resetPassStuDto){
        //1 获取数据
        log.info(resetPassStuDto.getNewPass());
        log.info(resetPassStuDto.getPassword());
        String curPass = resetPassStuDto.getPassword();
        curPass = DigestUtils.md5DigestAsHex(curPass.getBytes());
        String newPass = resetPassStuDto.getNewPass();
        newPass = DigestUtils.md5DigestAsHex(newPass.getBytes());
        Long id = resetPassStuDto.getId();

        //2 查询数据库,判断curPass是否正确
        LambdaQueryWrapper<Student> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Student::getId,id);
        queryWrapper.eq(Student::getPassword,curPass);

        Student stu = studentService.getOne(queryWrapper);
        // 3-1 curPass不正确,返回密码错误信息
        if(stu == null){
            return R.error("当前密码输入错误!");
        }
        //3-2 curPass正确,根据id跟新数据库password信息
        stu.setPassword(newPass);
        studentService.updateById(stu);

        return R.success("修改成功!");
    }


}
